#ifndef __MULTIPLAYERCHATROOM_HPP__
#define __MULTIPLAYERCHATROOM_HPP__

// 自定义多人聊天室应用层接收协议，制定发送和回送格式
#include <string>
#include <jsoncpp/json/json.h>
#include <vector>
#include "MyLog.hpp"

namespace QiHai
{
    // 请求
    class Request
    {
    public:
        std::string _message;
        int _level;  // 级别，1表示管理员 0表示普通用户
    public:
        Request(const std::string& message, int level = 0);  // 默认用户
        Request() = default;
        // 序列化
        std::string Serialization();
        // 反序列化
        void DeSerialization(const std::string& str);
    };

    // 响应
    class Respond
    {
    public:
        std::string _message;
        int _level;  // 级别，1表示管理员 0表示普通用户
        std::string _userName;// 用户名ip+port 目前是这样
    public:
        Respond(const std::string& userName, const std::string& message, int level = 0);
        Respond() = default;
        // 序列化
        std::string Serialization();
        // 反序列化
        void DeSerialization(const std::string& str);
    };

    // Request
    Request::Request(const std::string& message, int level)
    :_message(message), _level(level)
    {}
    std::string Request::Serialization()
    {
        Json::FastWriter write;
        Json::Value root;

        root["message"] = _message;
        root["level"] = _level;
        return write.write(root);
    }
    void Request::DeSerialization(const std::string& str)
    {
        Json::Reader read;
        Json::Value root;

        read.parse(str, root);  // 反序列化
        _message = root["message"].asString();
        _level = root["level"].asInt();
    }

    // Respond
    Respond::Respond(const std::string& userName, const std::string& message, int level)
    :_userName(userName), _message(message), _level(level)
    {}
    std::string Respond::Serialization()
    {
        Json::FastWriter write;
        Json::Value root;

        root["userName"] = _userName;
        root["message"] = _message;
        root["level"] = _level;
        return write.write(root);
    }
    void Respond::DeSerialization(const std::string& str)
    {
        Json::Reader read;
        Json::Value root;

        read.parse(str, root);  // 反序列化
        _userName = root["userName"].asString();
        _message = root["message"].asString();
        _level = root["level"].asInt();
    }

    // 解决粘包问题
    // {"message": "学习C++的各位好呀~"}{"message": "C++从入门到入坟"}{"message": "hh
    void SpliteMessage(std::string& buffer, std::vector<std::string>& messages)
    {
        size_t bpos = 0, epos = 0;
        while (true)
        {
            epos = buffer.find('}');  // 先找到右边括号的位置
            if (epos == buffer.npos)
            {
                // 说明右边括号找不到了 要么分离完毕要么存在缺失
                break;
            }
            std::string tmp = buffer.substr(bpos, epos + 1);
            buffer.erase(bpos, epos + 1);  // 删除掉~
            LOG(DEBUG) << tmp << "\n";
            messages.push_back(tmp);
        }
    }
}

#endif